<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[2.12]-海量数据：可配置的分库分表 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[2.12]-海量数据：可配置的分库分表，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong></strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="https://www.phalapi.net/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="https://www.phalapi.net/download.html">下载</a></li>
                    <li class="active"><a href="https://www.phalapi.net/wikis/">文档</a></li>
                    <li><a href="https://www.phalapi.net/donate.html">贡献</a></li>
                    <li><a href="#">|</a></li>
                    <li><a href="http://qa.phalapi.net/" target="_blank">社区</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a></li>
                    <li><a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B2.11%5D-%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3%EF%BC%9ADI%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5-%E8%AE%A9%E8%B5%84%E6%BA%90%E6%9B%B4%E5%8F%AF%E6%8E%A7.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.13%5D-%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%EF%BC%9A%E5%9C%A8%E7%BA%BFSQL%E8%AF%AD%E5%8F%A5%E6%9F%A5%E7%9C%8B%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html">下一章</a></h4>
<hr />
<h2>2.12.1 背景</h2>
<p>为了应对产品海量用户的愿景需求，这里将设计一个分布式的数据库存储方案，以便能满足数据量的骤增、云服务的横向扩展、后台接口开发的兼容性，以及数据迁移等问题，避免日后因为全部数据都存放在单台服务器上的限制。</p>
<h2>2.12.2 主要思想</h2>
<ul>
<li>1、分库分表</li>
<li>2、路由规则</li>
<li>3、扩展字段</li>
<li>4、可配置</li>
<li>5、SQL语句自动生成</li>
</ul>
<h3>(1)分库分表</h3>
<p>是指将不需要进行必要关联查询的表分开存放，如存放事件推送的weili_event_pushto和存放标签的weili_tag；同时，对于 同一个表，因为存放的数据量是可预见式的暴增，如上述的weili_event_pushto，每时每刻都会产生大量的来自用户发布的事件，因此为了突破 MySQL单表的限制以及其他问题，需要将此表同时创建N份。</p>
<h3>(2)路由规则</h3>
<p>在上面进行了分库分表后，开发人员在读取时，就需要根据相应的规则找到对应 的数据库和数据库表，这里建议每个表都需要有int(11)类型的id字段，以便作为分表的参考。</p>
<h3>(3)扩展字段</h3>
<p>在完成了分库分表和制定路由规则后，考虑到日后有数据库的DB变更，为减少DB变更对现有数据库表的影响，这里建议每个表都增加text类型的extra_data字段，并且使用json格式进行转换存储。</p>
<h3>(4)可配置</h3>
<p>在有了N台数据库服务器以及每个表都拆分成M张表后，为减少后台接口开发人员的压力，有必须在后台接口框架提供可配置 的支持。即：数据库的变更不应影响开发人员现有的开发，也不需要开发人员作出代码层面的改动，只需要稍微配置一下即可。关于这块，请见下面的框架实现部 分。</p>
<h3>(5)SQL语句自动生成</h3>
<p>对于相同表的建表语句，可以通过脚本来自动生成，然后直接导入数据即可。  </p>
<h2>2.12.3 PhalApi框架的实现方案</h2>
<p>PhalApi框架主要需要实现的是路由这一层的映射，并且通过可配置的方式进行控制，同时还应支持生产环境和测试环境的异同，如在测试环境我们明显不需要1000张数据库的表。为此，需要提供一种 <strong>表名 + id</strong> 映射到 <strong>数据库服务器 + 具体哪张表</strong> 的规则。
<img src="http://webtools.qiniudn.com/20150411005257_8ea80ab617023e2f377bf1ba8fdff6c5" alt="show" />
如上图所示，表名会统一加上前缀，并且将id按一定的表总数进行取模，最后再根据得到的具体表名，通过映射表查找到对应 的数据库服务器进行操作。其中，model层为开发实现，数据库表的映射由接口框架实现支持。</p>
<h2>2.12.4 使用示例</h2>
<h3>(1)配置数据库的路由配置</h3>
<p>修改./Config/dbs.php文件，以下是参考的示例配置。其中servers为DB服务器，包括数据库的账号信息等，tables为数据库表的映射关系，其中<strong>default</strong>下标为缺省的数据库路由。  </p>
<p>在每个数据库表里面，可以配置多个数据库表，通过开始的下标start和结束的下标end来对表进行分布式存放，并且如果没有start和end的，则视为不需要拆分存放，同时也是当找不到合适时的拆分表时所采用的默认配置。</p>
<pre><code class="language-php">return array(
    /**
     * avaiable db servers
     */
    'servers' =&gt; array(
        'db_demo' =&gt; array(
            'host'      =&gt; 'localhost',             //数据库域名
            'name'      =&gt; 'test',                  //数据库名字
            'user'      =&gt; 'root',                  //数据库用户名
            'password'  =&gt; '123456',                //数据库密码
            'port'      =&gt; '3306',                  //数据库端口
        ),
    ),

    /**
     * custom table map
     */
    'tables' =&gt; array(
        '__default__' =&gt; array(
            'prefix' =&gt; 'tbl_',
            'key' =&gt; 'id',
            'map' =&gt; array(
                array('db' =&gt; 'db_demo'),
            ),
        ),
        'demo' =&gt; array(
            'prefix' =&gt; 'tbl_',
            'key' =&gt; 'id',
            'map' =&gt; array(
                array('db' =&gt; 'db_demo'),
                array('start' =&gt; 0, 'end' =&gt; 2, 'db' =&gt; 'db_demo'),
            ),
        ),
    ),
);</code></pre>
<p>上面示例配置的意思是：</p>
<pre><code>表名   DB服务器
  tbl_demo    db_demo
  tbl_demo_0      db_demo
  tbl_demo_1      db_demo
  tbl_demo_2      db_demo</code></pre>
<h3>(2)准备需要创建表的基本SQL语句</h3>
<p>这里说的基本SQL语句是指：仅是这个表所特有的字段，排除已固定公共有的自增主键id，和扩展字段ext_data。下面是一个示例：</p>
<pre><code class="language-sql">`name` varchar(11) DEFAULT NULL,</code></pre>
<h3>(3)生成并导入SQL语句</h3>
<p>由于拆分后的数据库表数量众多，这里提供了一个快捷的脚本工具来生成所需要创建的数据库表。</p>
<pre><code class="language-bash">$ php ./build_sqls.php
Usage: ./build_sqls.php &lt;dbs_config&gt; &lt;table&gt; [engine=InnoDB]</code></pre>
<p>执行上面的脚本，输入数据库表参数后：</p>
<pre><code class="language-bash"> php ./build_sqls.php ./Config/dbs.php demo</code></pre>
<p>将会从配置文件 里面寻找所需要创建的表，并生成类似以下的SQL语句：</p>
<pre><code class="language-sql">/**
 * DB: localhost  db_demo
 */

CREATE TABLE `demo` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(11) DEFAULT NULL,
    `ext_data` text COMMENT 'json data here',
     PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/**
 * DB: localhost  db_demo
 */

CREATE TABLE `tpl_demo_0` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(11) DEFAULT NULL,
    `ext_data` text COMMENT 'json data here',
     PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tpl_demo_1` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(11) DEFAULT NULL,
    `ext_data` text COMMENT 'json data here',
     PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tpl_demo_2` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(11) DEFAULT NULL,
    `ext_data` text COMMENT 'json data here',
     PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code></pre>
<h3>(4)使用与代码开发</h3>
<p>在将上面的SQL语句导入数据库后，即可以像之前那样操作数据库。下面是一些示例：</p>
<pre><code class="language-php">DI()-&gt;notorm = new PhalApi_DB_NotORM(PhalApi_DI::one()-&gt;config-&gt;get('dbs'), true);

DI()-&gt;notorm-&gt;demo-&gt;where('id', '1')-&gt;fetch();</code></pre>
<p>用到了拆分表的代码示例，假设demo表被拆分成了3个表，则客户端在调用里，需要根据（id % 3 ）来拼接合适的数据库表名，其他使用不变。</p>
<pre><code class="language-php">DI()-&gt;notorm = new PhalApi_DB_NotORM(PhalApi_DI::one()-&gt;config-&gt;get('dbs'), true);

$row = DI()-&gt;notorm-&gt;demo_0-&gt;where('id', '3')-&gt;fetch();
$row = DI()-&gt;notorm-&gt;demo_1-&gt;where('id', '10')-&gt;fetch();
$row = DI()-&gt;notorm-&gt;demo_2-&gt;where('id', '2')-&gt;fetch();</code></pre>
<h4>使用Model基类的情况</h4>
<p>更好的写法，应该是继承于PhalApi_Model_NotORM，并统一实现分表的操作，如：  </p>
<pre><code class="language-php">&lt;?php

class Model_Demo extends PhalApi_Model_NotORM {

    protected function getTableName($id) {
        $tableName = 'demo';
        if ($id !== null) {
            $tableName .= '_' . ($id % 3);
        }
        return $tableName;
    }
}</code></pre>
<p>然后，上面的查询分别对应：  </p>
<pre><code class="language-php">$model = new Model_Demo();

$row = $model-&gt;get('3', 'id');
$row = $model-&gt;get('10', 'id');
$row = $model-&gt;get('2', 'id');</code></pre>
<p>更进一步，我们可以通过$this-&gt;getORM($id)来获取分表的实例进行分表的操作，如：  </p>
<pre><code class="language-php">&lt;?php

class Model_Demo extends PhalApi_Model_NotORM {

    //... ...

    public function getNameById($id) {
        $row = $this-&gt;getORM($id)-&gt;select('name')-&gt;fetchRow(); //假设$id为3，则 $this-&gt;getORM($id) 等效于 DI()-&gt;notorm-&gt;demo_0
    return !empty($row) ? $row['name'] : '';
    }

}</code></pre>
<h2>2.12.5 多个数据库的配置方式</h2>
<p>当需要使用多个数据库时，可以先在servers中可以配置多组数据库的信息，然后在tables为不同的数据库表指定不同的数据库服务器。  </p>
<p>假设我们有两台数据库服务器，分别叫做db_A、db_B，即：  </p>
<pre><code class="language-php">return array(
    /**
     * DB数据库服务器集群
     */
    'servers' =&gt; array(
        'db_A' =&gt; array(                              //db_A
            'host'      =&gt; '192.168.0.1',             //数据库域名
            // ... ...
        ),
        'db_B' =&gt; array(                              //db_B
            'host'      =&gt; '192.168.0.2',             //数据库域名
            // ... ...
        ),
    ),

    //... ...</code></pre>
<p>若db_A服务器中的数据库有表a_table_user、a_table_friends，而db_B服务器中的数据库有表b_table_article、b_table_comments，则：  </p>
<pre><code class="language-php">&lt;?php
return array(

    //... ...

    /**
     * 自定义路由表
     */
    'tables' =&gt; array(
        //通用路由
        '__default__' =&gt; array(
            'prefix' =&gt; 'a_',  //以 a_ 为表前缀
            'key' =&gt; 'id',
            'map' =&gt; array(
                array('db' =&gt; 'db_A'),  //默认，使用db_A数据库
            ),
        ),

        'table_article' =&gt; array(                                     //表b_table_article
            'prefix' =&gt; 'b_',                                         //表名前缀
            'key' =&gt; 'id',                                            //表主键名
            'map' =&gt; array(                                           //表路由配置
                array('db' =&gt; 'db_B'),                                // b_table_article表使用db_B数据库
            ),
        ),

        'table_comments' =&gt; array(                                    //表b_table_article
            'prefix' =&gt; 'b_',                                         //表名前缀
            'key' =&gt; 'id',                                            //表主键名
            'map' =&gt; array(                                           //表路由配置
                array('db' =&gt; 'db_B'),                                // b_table_comments表使用db_B数据库
            ),
        ),
    ),
</code></pre>
<p>如果项目存在分表的情况，可结合上述的分表的说明进行配置。<br />
这里为了让大家更为明了，假设db_A服务器中的数据库有表a_table_user、a_table_friends_0到a_table_friends_9（共10张表），
而db_B服务器中的数据库有表b_table_article、b_table_comments_0到b_table_comments_19（共20张表），则结合起来的完整配置为：</p>
<pre><code class="language-php">&lt;?php
return array(
    /**
     * DB数据库服务器集群
     */
    'servers' =&gt; array(
        'db_A' =&gt; array(                              //db_A
            'host'      =&gt; '192.168.0.1',             //数据库域名
            // ... ...
        ),
        'db_B' =&gt; array(                              //db_B
            'host'      =&gt; '192.168.0.2',             //数据库域名
            // ... ...
        ),
    ),

    /**
     * 自定义路由表
     */
    'tables' =&gt; array(
        //通用路由
        '__default__' =&gt; array(
            'prefix' =&gt; 'a_',  //以 a_ 为表前缀
            'key' =&gt; 'id',
            'map' =&gt; array(
                array('db' =&gt; 'db_A'),  //默认，使用db_A数据库
            ),
        ),

        'table_friends' =&gt; array(                                     //分表配置
            'prefix' =&gt; 'a_',                                         //表名前缀
            'key' =&gt; 'id',                                            //表主键名
            'map' =&gt; array(                                           //表路由配置
                array('db' =&gt; 'db_A'),                                // b_table_comments表使用db_B数据库
                array('start' =&gt; 0, 'end' =&gt; 9, 'db' =&gt; 'db_A'),      //分表配置（共10张表）
            ),
        ),

        'table_article' =&gt; array(                                     //表b_table_article
            'prefix' =&gt; 'b_',                                         //表名前缀
            'key' =&gt; 'id',                                            //表主键名
            'map' =&gt; array(                                           //表路由配置
                array('db' =&gt; 'db_B'),                                // b_table_article表使用db_B数据库
            ),
        ),

        'table_comments' =&gt; array(                                    //表b_table_article
            'prefix' =&gt; 'b_',                                         //表名前缀
            'key' =&gt; 'id',                                            //表主键名
            'map' =&gt; array(                                           //表路由配置
                array('db' =&gt; 'db_B'),                                // b_table_comments表使用db_B数据库
                array('start' =&gt; 0, 'end' =&gt; 19, 'db' =&gt; 'db_B'),     //分表配置（共20张表）
            ),
        ),
    ),
);</code></pre>
<h2>2.12.6 与主从数据库的有机结合</h2>
<p>虽然这是专门为海量数据设计的存储方案，但也是可以结合主从配置来获得更庞大强壮的方案，当然为之付出的是复杂性的引入。  </p>
<p>简单地，可以将dbs.php复制一份dbs_slave.php出来给从库使用，然后注册一个从库的服务：</p>
<pre><code class="language-php">DI()-&gt;slaveNotorm = new PhalApi_DB_NotORM(DI()-&gt;config-&gt;get('slave_dbs'));</code></pre>
<p>最后，在需要使用从库来读取时，使用slaveNotorm 服务即可。</p>
<h2>2.12.7 不足与注意点</h2>
<p>这样的设计是有明显的灵活性的，因为在后期如果需要迁移数据库服务器，我们可以在框架支持的情况下轻松应对，但依然需要考虑到一些问题和不足。</p>
<h3>(1)DB变更</h3>
<p>DB变更，这块是必不可少的，但一旦数据库表被拆分后，表数量的骤增导致变更执行困难，所以这里暂时使用了一个折中的方案，即提供了一个ext_data 扩展字段用于存放后期可能需要的字段信息，建议采用json格式，因为通用且长度比序列化的短。但各开发可以根据自己的需要决定格式。即使如此，扩展字段 明显做不到一些SQL的查询及其他操作。</p>
<h3>(2)表之间的关联查询</h3>
<p>表之间的关联查询，这个是分拆后的最大问题。虽然这样的代价是我们可以得到更庞大的存储设计， 而且很多表之间不需要必须的关联的查询，即使我们需要，我们也可以通过其他手段如缓存和分开查询来实现。这对开发人员有一定的约束，但是对于可预见性的海 量数量，这又是必须的。</p>
<hr />
<h4><a href="/wikis/%5B2.11%5D-%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3%EF%BC%9ADI%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5-%E8%AE%A9%E8%B5%84%E6%BA%90%E6%9B%B4%E5%8F%AF%E6%8E%A7.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.13%5D-%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%EF%BC%9A%E5%9C%A8%E7%BA%BFSQL%E8%AF%AD%E5%8F%A5%E6%9F%A5%E7%9C%8B%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
&nbsp;&nbsp;
<a href="http://docs.phalapi.net/#/v2.0/">切换到PhalApi 2.x 开发文档。</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <span>|</span>
                    <a href="http://qa.phalapi.net/" target="_blank">社区</a>
                    <span>|</span>
                    <a href="download.html" target="_blank">下载</a>
                    <span>|</span>
                    <a href="/wikis/">文档</a>
                    <span>|</span>
                    <a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a>
                    <span>|</span>
                    <a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a>
                    <span>|</span>
                    <a href="donate.html" target="_blank">贡献</a>
                    <span>|</span>
                    <a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a>
                    <span>|</span>
                    <a href="/license.html" target="_blank">许可</a>
                    <span>|</span>
                    <a href="/about.html" target="_blank">关于</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/en/" target="_blank">English</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
					<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=f16292029e59975d4ccfccc70ed87aa5c5646df512e83b0e9e1270e8368be461"><img border="0" src="images/qq.png" alt="π框架 - PhalApi交流群②" title="π框架 - PhalApi交流群②"></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>